package ru.dc.gui.swing;

import ru.dc.Application;
import ru.dc.DownloadQueue;
import ru.dc.gui.DownloadsTableModel;
import ru.dc.gui.swing.util.ServerInfoRenderer;
import ru.dc.object.DownloadItem;
import ru.dc.object.DownloadItemStatus;
import ru.dc.object.DownloadListener;
import ru.dc.object.HubEventListener;
import ru.dc.object.events.download.Connecting;
import ru.dc.object.events.download.DownloadQueueEvent;
import ru.dc.object.events.download.FailedConnect;
import ru.dc.object.events.hub.HubEvent;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * Панель со списком загрузок.
 */
public class DownloadsPanel extends JPanel implements DownloadListener {

    private JTable downloads = new JTable();
    /**
     * Пауза, после которой статус загрузки будет изменен с "Соединяется" на "Ожидает"
     */
    private static final int DELAY_RESET_TO_WAITING = 9000;

    public DownloadsPanel() {

        //Подписываемся на события очереди загрузок
        Application.getApplication().getDownloadQueue().addDownloadListener(this);


        //создаем таблицу
        final DownloadsTableModel model = new DownloadsTableModel();
        downloads.setModel(model);
        downloads.getColumnModel().getColumn(5).setCellRenderer(new ServerInfoRenderer());

        //добавляем таблицу в центр
        setLayout(new BorderLayout());
        add(new JScrollPane(downloads), BorderLayout.CENTER);

    }


    public void onDownloadEvent(final DownloadQueueEvent e) {

        //событие - отправлен запрос на соединение
        if (e.getOperation()== DownloadQueueEvent.ITEM_CONNECTING) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    //для соответствующего элемента проставляем статус
                    final DownloadsTableModel model = (DownloadsTableModel) downloads.getModel();
                    model.updateDownloadStatus(e.getItem(), DownloadItemStatus.CONNECTING);
                    //запускаем таймер - по истечении интервала меняем статус на "Ожидает"
                    //todo статус надо менять только если статус загрузки "Ожидает"
                    Timer t = new Timer(DELAY_RESET_TO_WAITING, new ActionListener() {
                        public void actionPerformed(ActionEvent ex) {
                            SwingUtilities.invokeLater(new Runnable() {
                                public void run() {
                                    model.updateDownloadStatus(e.getItem(), DownloadItemStatus.WAITING);
                                }
                            });
                        }
                    });
                    t.setRepeats(false);
                    t.start();
                }
            });
        }
        else if (e.getOperation() == DownloadQueueEvent.ITEM_ADDED) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    final DownloadsTableModel model = (DownloadsTableModel) downloads.getModel();
                    model.addDownloadItem(e.getItem());
                }
            });
        }
        else if (e.getOperation() == DownloadQueueEvent.ITEM_REMOVED) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    final DownloadsTableModel model = (DownloadsTableModel) downloads.getModel();
                    model.removeDownloadItem(e.getItem());
                }
            });
        }
        else if (e.getOperation() == DownloadQueueEvent.ITEM_DOWNLOADING) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    final DownloadsTableModel model = (DownloadsTableModel) downloads.getModel();
                    model.updateDownloadStatus(e.getItem(), DownloadItemStatus.DOWNLOADING);
                    model.updateDownloaded(e.getItem(), e.getDownloaded());
                }
            });
        }

    }


}
